global escalaDeGrises2

section .text
%define sumandoextra [ebp -4]
escalaDeGrises2:
    push    ebp
    mov     ebp, esp
    sub esp, 4
    push    ebx
    push    edi
    push    esi
 
    mov     eax, [ebp + 16]
    mov     DWORD sumandoextra, 0
    xor     edx, edx
    mov     ebx, 4
    div     ebx
    cmp     edx, 0
    jz      dale
    sub     ebx, edx
    mov     sumandoextra, ebx
    dale:
    mov     esi, [ebp+8]  ;puntero al principio del vector
    mov     ecx, [ebp+12] ; tamaño en bytes
    mov     edi, [ebp + 16]
   
    
ciclo:
    mov edi, [ebp+16]

    ciclo2:
    cmp edi, 0
    je finCiclo2
    xor     eax, eax      ;limpio registros
    xor     edx, edx
    xor     ebx, ebx
    mov     al, [esi]     ;cargo pixeles
    mov     dl, [esi+1]
    mov     bl, [esi+2]

    ; a partir de aca se busca determinar cual es el maximo

    cmp     al, dl   
    jg      alVSbl   ; al > dl, falta comparar con bl
    cmp     dl, bl   ; dl >= al, compar con bl
    jg      esDl     ; del es el maximo
    
esBl:       ; caso en que bl es el maximo
    mov     [esi], bl
    mov     [esi+1], bl   ; lo pego en los colores q hace falta
    
seguir:     ; se acomoda todo para la proxima iteracion
    add     esi, 3        ;prox pixel
    sub     edi, 3           ;ecx = ecx - 3, 2 decs y uno del loop 
    jmp ciclo2
    
    finCiclo2:
    add esi, sumandoextra
    loop    ciclo
    jmp     fin
    
alVSbl:
    cmp     al, bl        ; comparo al con bl, ya sabia que al > dl
    jl      esBl          ; si bl es mas grande lo copio en los colores     
    mov     [esi+1], al   ; sino al es el max, lo pongo en los colores
    mov     [esi+2], al
    jmp     seguir        ; salto a preparar los parametros de la proxima iteracion
    
esDl:       ; caso en el que de dl es el maximo
    mov     [esi], dl
    mov     [esi+2], dl   ; lo pongo en donde hace falta
    jmp     seguir       
    
fin:
    pop     esi
    pop     edi
    pop     ebx
    add     esp, 4
    pop     ebp
    ret

